home *** CD-ROM | disk | FTP | other *** search
/ PCMania 75 / PCMania CD75_1.iso / pcmania / virus75 / ANTIVAMP.C next >
C/C++ Source or Header  |  1998-11-10  |  9KB  |  291 lines

  1. /*----------------------------------------------*/
  2. /* ANTI-VAMPIRO (c) 1998 Por Javier Guerrero Díaz 
  3. /* Busca en archivos el virus VAMPIRO.1000.
  4. /*
  5. /* La sintaxis es: ANTIVAMP [directorio] </a>.
  6. /* El programa buscará el virus en todos los
  7. /* archivos contenidos en el directorio especificado.
  8. /* Programado con Borland C++ 5.02
  9. /*----------------------------------------------*/
  10. /*      Javier Guerrero Díaz     */
  11. /*      email: jgd@redestb.es    */
  12. /*-------------------------------*/
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16. #include <dir.h>
  17. #include <conio.h>
  18. #include <bios.h>
  19. #include <stdlib.h>
  20. #include <direct.h>
  21. #include <io.h>
  22.  
  23. void fin(void);
  24. void mal(void);
  25. void intro(void);
  26. void buscafichero(void);
  27. void panta(void);
  28. void obtieneinfo(void);
  29. void mensaje(char *mensa);
  30. void encontrado(void);
  31. void matavir(void);
  32. void elige(void);
  33. void analiza(void);
  34.  
  35. #define LOWORD(l)           ((unsigned int)(l))
  36. #define HIWORD(l)           ((unsigned int)(((unsigned long)(l) >> 16) & 0xFFFF))
  37. #define LOBYTE(w)           ((unsigned char)(w))
  38. #define HIBYTE(w)           ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF))
  39.  
  40. union REGS registros;
  41. char tecla,diractual[50],dirdestino[50];
  42. int temp,infec=0,analiz=0,segmento;
  43. unsigned long memlibre=0;
  44. FILE *fichero;
  45. struct ffblk arch;
  46. struct date fecha;
  47. struct dostime_t hora;
  48. char cadena[]={ 0x9B, 0xBD, 0xE8, 0x98 };
  49. char flag;
  50. int far *direcc;
  51. unsigned long int salto,offset;
  52. char orgbyt[7];
  53.  
  54. #pragma argsused
  55. void main(argc,argv)
  56. int argc;
  57. char *argv[];
  58. {
  59. if (*argv[1]==NULL || *argv[1]=='?') 
  60.         { printf("\nANTIVAMP (c)1998 Por Javier Guerrero Díaz\n");
  61.               printf("Sintaxis: ANTIVAMP [directorio] </a>\n"); exit(-1);}
  62. if (argv[2][0]=='/' && argv[2][1]=='A') flag='a';
  63. else if (argv[2][0]=='/' && argv[2][1]=='a') flag='a';
  64. else flag=NULL;
  65.  
  66. getcwd(diractual,50);
  67. _setcursortype(_NOCURSOR);
  68.  
  69. if (chdir(argv[1])==-1) { printf("\nError. No puedo acceder al directorio ");
  70.             printf("%s.\n",argv[1]); mal(); }
  71. getcwd(dirdestino,50);
  72. intro();
  73. panta();
  74. buscafichero();
  75. fin();
  76. }
  77.  
  78. void matavir(void)
  79. {
  80. int res,handle;
  81. unsigned long tamanoreal;
  82.  
  83. tamanoreal=arch.ff_fsize-1000;
  84. res=fseek(fichero,tamanoreal+0x225,SEEK_SET);
  85.     if (res!=0) { 
  86.              mensaje("Error gestionando fichero!."); mal();
  87.             }
  88. res=fread(orgbyt,1,7,fichero);
  89.         if (res!=7) { 
  90.              mensaje("Error leyendo archivo!."); mal();
  91.             }
  92. rewind(fichero);
  93. res=fwrite(orgbyt,1,7,fichero);
  94.         if (res!=7) { 
  95.                      mensaje("Error escribiendo archivo!."); mal();
  96.             }
  97. handle=fileno(fichero); res=chsize(handle,tamanoreal);
  98. if (res!=0) { 
  99.          mensaje("Error al modificar el tamaño del archivo."); mal();
  100.         }
  101. if (flag!='a')
  102.     {
  103.      mensaje("OK!. Virus eliminado del fichero.");
  104.     }
  105. else
  106.     {
  107.      window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  108.      cprintf("                                                  ");
  109.      gotoxy(24,23); cprintf("OK!. Virus eliminado del fichero.");
  110.      sleep(1); gotoxy(24,23);
  111.      cprintf("                                                  ");                 
  112.     }
  113. }
  114.  
  115. void analiza(void)
  116. {
  117. int res;
  118. char buffer[4];
  119.  
  120. res=fseek(fichero,3,SEEK_SET);
  121.     if (res!=0) { 
  122.              mensaje("Error gestionando fichero!."); mal();
  123.             }
  124. res=fread(buffer,1,4,fichero);
  125.     if (res!=4) { 
  126.              mensaje("Error leyendo archivo!."); mal();
  127.             }
  128. for (res=0;res<4;res++)
  129.     {
  130.      if (cadena[res]!=buffer[res]) goto sale;
  131.     }
  132.     encontrado();
  133. sale:
  134. }
  135.  
  136. void encontrado(void)
  137. {
  138. window(22,8,57,20);infec++;
  139. textattr(WHITE|RED<<4);
  140. cprintf("╔═══════════╦══════════╦═══════════╗");
  141. cprintf("║           ║ ATENCION ║           ║");
  142. cprintf("║           ╚══════════╝           ║");
  143. cprintf("║                                  ║");
  144. cprintf("║                                  ║");
  145. cprintf("║                                  ║");
  146. cprintf("║                                  ║");
  147. cprintf("║                                  ║");
  148. if (flag!='a'){
  149. cprintf("║ PULSE LA TECLA 'SUPR' PARA MATAR ║");
  150. cprintf("║  EL VIRUS O CUALQUIER OTRA PARA  ║");
  151. cprintf("║      IGNORAR ESTE FICHERO.       ║");
  152. cprintf("╚══════════════════════════════════╝");}
  153. else {
  154. cprintf("║ ATENCION: EL MODO AUTOMATICO HA  ║");
  155. cprintf("║  SIDO ACTIVADO. EL FICHERO SERA  ║");
  156. cprintf("║   DESINFECTADO AUTOMATICAMENTE.  ║");
  157. cprintf("╚══════════════════════════════════╝");}
  158. gotoxy(3,5); cprintf("SE DETECTO LA MARCA DE INFECCION");
  159. gotoxy(3,6); cprintf(" PROPIA DEL VIRUS 'VAMPIRO.1000'");
  160. gotoxy(3,7); cprintf("    EN ARCHIVO:");
  161.  
  162. textattr(YELLOW|RED<<4); gotoxy(19,7); cprintf("%-12s",arch.ff_name);
  163. textattr(WHITE|BLUE<<4); window(1,1,80,25);
  164. mensaje("Atención: Fichero infectado por el virus !.");
  165. if (flag!='a') elige(); 
  166. else matavir();
  167. panta(); obtieneinfo();
  168. gotoxy(28,15); cprintf("%-12s",arch.ff_name);
  169. gotoxy(62,15); cprintf("%-8ld",arch.ff_fsize);
  170. gotoxy(33,17); cprintf("%-3d",analiz);
  171. gotoxy(64,17); cprintf("%-3d",infec);
  172. }
  173.  
  174. void elige(void)
  175. {
  176. int res=0;
  177.  
  178. res=bioskey(0);
  179. if (res==0x5300) matavir();
  180. else if (res==0x532E) matavir();
  181. }
  182.  
  183. void obtieneinfo(void)
  184. {
  185. getdate(&fecha);
  186. _dos_gettime(&hora);
  187. registros.h.ah=0x48; registros.x.bx=0xFFFF;
  188. int86(0x21,®istros,®istros);
  189. memlibre=registros.x.bx; memlibre*=16;
  190. gotoxy(14,11); cprintf("%02d/%02d/%d",fecha.da_day,fecha.da_mon,fecha.da_year);
  191. gotoxy(34,11); cprintf("%02d:%02d:%02d",hora.hour,hora.minute,hora.second);
  192. gotoxy(62,11); cprintf("%ld",memlibre); gotoxy(32,13); cprintf("%s",dirdestino);
  193. }
  194.  
  195. void buscafichero(void)
  196. {
  197. temp=findfirst("*.*",&arch,0);
  198.     while (!temp)
  199.         { obtieneinfo();
  200.     fichero=fopen(arch.ff_name,"r+b");
  201.         if (fichero==NULL) 
  202.         { gotoxy(24,23);
  203.           cprintf("                                                  ");
  204.           gotoxy(24,23); cprintf("Error abriendo fichero!"); putch(7);
  205.           sleep(1); gotoxy(24,23);
  206.           cprintf("                                                  ");                        
  207.         }
  208.         if (arch.ff_fsize<521) goto cierra;
  209.         analiz++;
  210.         gotoxy(28,15);
  211.         cprintf("%-12s",arch.ff_name);
  212.         gotoxy(62,15);
  213.         cprintf("%-8ld",arch.ff_fsize);
  214.         gotoxy(33,17);
  215.         cprintf("%-3d",analiz); 
  216.         gotoxy(64,17);
  217.         cprintf("%-3d",infec);
  218.         analiza();
  219. cierra:         fclose(fichero);
  220.         temp=findnext(&arch);
  221.         }
  222.  
  223. chdir(diractual);       
  224. }
  225.  
  226. void intro(void)
  227. {
  228. clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
  229. cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
  230. cprintf("║             ANTI-VAMPIRO            ║\n"); gotoxy(20,11);
  231. cprintf("║ (c) 1998  Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
  232. cprintf("║ Rastrea los archivos del directorio ║\n"); gotoxy(20,13);
  233. cprintf("║  especificado como parámetro a la   ║\n"); gotoxy(20,14);
  234. cprintf("║     busqueda del virus VAMPIRO.     ║\n"); gotoxy(20,15);
  235. cprintf("╚═════════════════════════════════════╝\n");
  236. textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
  237. clrscr();
  238. }
  239.  
  240. void panta(void)
  241. {
  242. window(20,2,60,7);
  243. gotoxy(1,1);
  244. textattr(YELLOW|BLUE<<4);
  245. cprintf("╔═══════════════════════════════════════╗");
  246. cprintf("║  DETECTOR/VACUNA DEL VIRUS: VAMPIRO   ║");
  247. cprintf("║     (C) Por Javier Guerrero Diaz      ║");
  248. cprintf("╚═══════════════════════════════════════╝");
  249. window(5,8,75,20);
  250. cprintf("╔═════════════════════════════════════════════════════════════════════╗");
  251. cprintf("║                         ANALISIS DE ARCHIVOS                        ║");
  252. cprintf("║                                                                     ║");
  253. cprintf("║ Fecha:               Hora:              Memoria Libre:        bytes ║");
  254. cprintf("║                                                                     ║");
  255. cprintf("║  Directorio de Búsqueda:                                            ║");
  256. cprintf("║                                                                     ║");
  257. cprintf("║  Nombre de Archivo :                 Longitud Archivo:              ║");
  258. cprintf("║                                                                     ║");
  259. cprintf("║      Archivos Analizados:           Archivos Infectados:            ║");
  260. cprintf("║                                                                     ║");
  261. cprintf("╚═════════════════════════════════════════════════════════════════════╝");
  262. window(1,22,80,25);
  263. cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
  264. cprintf("║ RESULTADO OPERACION:                                                         ║");
  265. cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
  266. textattr(WHITE|BLUE<<4); window(1,1,80,25);
  267. }
  268.  
  269. void mensaje(mensa)
  270. char mensa[50];
  271. {
  272. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  273. cprintf("                                                  ");
  274. gotoxy(24,23); cprintf("%s",mensa); putch(7);
  275. sleep(1); gotoxy(24,23);
  276. cprintf("                                                  ");                 
  277. }
  278.  
  279. void fin(void)
  280. {
  281. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  282. exit(0);
  283. }
  284.  
  285. void mal(void)
  286. {
  287. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  288. printf("\nPrograma finalizado anormalmente.\n");
  289. exit(-1);
  290. }
  291.